package Recolector;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;


/**
 * Clase que encapsula una URL y que nos permite descargar su contenido
 * @author Mikel&Igor
 */
public class URLBrowser {
    private URL url;

    /**
     * No lo usaremos
     * @deprecated 
     */
    public URLBrowser() {
    }

    /**
     * Constructor preferido
     * @param url La url
     */
    public URLBrowser(URL url) {
        this.url = url;
    }

    /**
     * Setter generado automáticamente
     * @param url La URL del browser
     */
    public void setUrl(URL url) {
        this.url = url;
    }
    /**
     * Setter generado automáticamente
     * @return La URL del browser
     */
    public URL getUrl() {
        return url;
    }
    
    /**
     * Función que permite recolectar el código html de la URL que representa esta
     * clase.
     * Se ha utilizado un método más eficiente de concatenar el html en un string que
     * un simple string + string.
     * @return Un String con todo el html de la página
     * @throws IOException Cuando hay algún error al abrir o leer la página
     */
    public String recolectar() throws IOException {
        System.out.println("\t\t>>> Accediendo: " + url);
        // Para medir el tiempo que nos cuesta bajar la página
        long start = System.currentTimeMillis();

        // Abrir los readers, streams, ... necesarios
        InputStream is = url.openStream( );
        InputStreamReader isr = new InputStreamReader(is,"ISO-8859-1");
        BufferedReader br = new BufferedReader (isr);

        String linea;
        // Un buffer que permite ir añadiendo líneas al final de manera eficiente
        StringBuilder res = new StringBuilder();
        // Mientras queden líneas en el reader, ir poniéndolas al final
        while ((linea = br.readLine()) != null) {
            res.append(linea);
            res.append('\n');
        }

        // Cerrar todo
        br.close();
        isr.close();
        is.close();

        //Medir el tiempo
        long end = System.currentTimeMillis();
        System.out.println("\t\t<<< Leido ("+ (end-start) +" ms): " + url);
        return res.toString();
     }
}
